/**
 *	@file	marker_util.h
 *	@brief	マップマーカー参照用不完全型定義＆ユーティリティ関数定義
 *	@author	MiyukiIwasawa
 *	@date	07.08.02
 */

#ifndef __H_MARKER_UTIL_H__
#define __H_MARKER_UTIL_H__

///定数定義
#include "savedata/marker_def.h"

#include "savedata/savedata_def.h"
#include "system/pm_str.h"
#include "system/pms_data.h"

#ifdef GLOBAL
#undef GLOBAL
#endif

#ifdef __MARKER_UTIL_H_GLOBAL
#define GLOBAL /***/
#else
#define GLOBAL extern
#endif


//------------------------------------------------------------
/**
 * @brief マーカーセーブデータブロック管理構造への不完全型ポインタ
 *
 * 中身は見えないけどポインタ経由で参照はできる
 */
//------------------------------------------------------------
typedef struct _MARKER_BLOCK MARKER_BLOCK;

//------------------------------------------------------------
/**
 * @brief	マーカーデータ管理構造への不完全型ポインタ
 *
 * 中身は見えないけどポインタ経由で参照はできる
 */
//------------------------------------------------------------
typedef struct _MARKER_DATA MARKER_DATA;

/**
 *	@brief	マーカーデータの取得/セットに用いるTmpワーク構造体型
 *
 *	＊公開型
 *	＊マーカーデータをMARKER_DATA_WK型に取得し、MARKER_DATA_WK型にセットして
 *	　セーブデータにPushする
 */
typedef struct _MARKER_DATA_WK{
	int zone;
	u8			icon[MARKER_PARAM_NUM];
	PMS_WORD	word[MARKER_PARAM_NUM];
}MARKER_DATA_WK;

/**
 *	@brief	マーカーデータサイズ取得
 */
GLOBAL int MarkerData_GetWorkSize(void);

/**
 *	@brief	マーカーブロックデータサイズ取得
 */
GLOBAL int MarkerBlockData_GetWorkSize(void);

/*
 *	@brief	そのマーカーデータが有効かどうか？
 */
GLOBAL BOOL MarkerData_IsEnable(MARKER_DATA* dat);

/*
 *	@brief	マーカーデータクリア
 */
GLOBAL void MarkerData_Clear(MARKER_DATA* dat);

/**
 *	@brief	マーカーデータワーク作成
 */
GLOBAL MARKER_DATA* MarkerData_AllockWork(int heapID);

/**
 *	@brief	マーカーデータコピー
 */
GLOBAL void MarkerData_Copy(MARKER_DATA* src,MARKER_DATA* dest);

//=================================================================
// マーカーワーク操作系
//=================================================================

/**
 *	@brief	マーカーワーク構造体をクリア
 */
GLOBAL void MarkerDataWk_Clear(MARKER_DATA_WK* wk);

/**
 *	@brief	マーカーワークのzone以外のパラメータが有効かどうか？
 *
 *	@retval TRUE : 有効なパラメータある
 *	@retval FALSE : 有効なパラメータがない
 */
GLOBAL int MarkerDataWk_IsParamEnable(MARKER_DATA_WK* wk);


//=================================================================
// マーカーセーブデータブロックアクセス系
//=================================================================

/**
 *	@brief	マーカーブロックデータクリア
 */
GLOBAL void MarkerBlock_Clear(MARKER_BLOCK* dat);

/**
 *	@brief	指定したindexのデータが有効かどうか？
 */
GLOBAL BOOL MarkerBlock_IsMarkDataEnable(MARKER_BLOCK* pb,u8 idx);

/**
 *	@brief	指定したindexのマーカーデータをクリアする
 */
GLOBAL void MarkerBlock_DataClearFromIdx(MARKER_BLOCK* pb,u8 idx);

/**
 *	@brief	指定したindexのマーカーデータをワーク構造体型に取得する
 */
GLOBAL BOOL MarkerBlock_GetWorkFromIdx(MARKER_BLOCK* pb,MARKER_DATA_WK* wk,u8 idx);

/**
 *	@brief	指定したindex位置のマーカーデータに
 *			ワーク構造体型で渡されたデータをセットする
 *
 *	@param	pb	ブロックデータへのポインタ
 *	@param	wk	セットしたいパラメータを格納したワーク型へのポインタ
 *	@param	idx	セットしたい位置
 *	@param	mode	上書き可ならTRUE,不可ならFALSE
 *
 *	@return TRUE:セットできた、FALSE：セット出来なかった
 */
GLOBAL BOOL MarkerBlock_SetWorkFromIdx(MARKER_BLOCK* pb,MARKER_DATA_WK* wk,u8 idx,u8 mode);









#endif	//__H_MARKER_UTIL_H__